import numpy as np
import time
# todo 排序函数
# a = np.array([[3, 7, 12, 45], [9, 1, 0, 34]])
# print("初始数组：")
# print(a)
# print('\n')
#
# print(np.char.center('调用 sort() 函数，默认快速排序', 15, '*'))
# print(np.sort(a))
# print('\n')
#
# print(np.char.center('按列排序', 15, '*'))
# print(np.sort(a, axis=0))
# print('\n')
#
# b = np.random.randint(1, 1000, size=[10000, 10000])
#
# print(np.char.center('快速排序时间', 15, '*'))
# t1 = time.time()
# np.sort(b)
# t2 = time.time()
# print(t2 - t1)
# print('\n')
#
# print(np.char.center('堆排序时间', 15, '*'))
# t3 = time.time()
# np.sort(b, -1, 'heapsort')
# t4 = time.time()
# print(t4 - t3)
# print('\n')
#
# print(np.char.center('归并排序时间', 15, '*'))
# t5 = time.time()
# np.sort(b, -1, 'mergesort')
# t6 = time.time()
# print(t6 - t5)
# print('\n')
#
# # 根据字段排序
# dt = np.dtype([('name', 'S10'), ('age', int)])
# c = np.array([("raju", 21), ("anil", 25), ("ravi", 17), ("amar", 27)], dtype=dt)
# print(np.char.center('根据字段排序的数组', 15, '*'))
# print(c)
# print('\n')
#
# print(np.char.center('按 name 排序', 15, '*'))
# print(np.sort(c, order='name'))

# numpy.argsort() 函数对输入数组沿给定轴执行间接排序，并使用指定排序类型返回数据的索引数组。 这个索引数组用于构造排序后的数组。
# a = np.array([3, 4, 2])
# print("初始数组：")
# print(a)
# print('\n')
#
# print(np.char.center('调用 argsort() 函数', 15, '*'))
# b = np.argsort(a)
# # 索引数组
# print(b)
# print('\n')
#
# print(np.char.center('以排序后的顺序重构原数组', 15, '*'))
# print(a[b])
# print('\n')

# numpy.lexsort() 函数使用键序列执行间接排序。 键可以看作是电子表格中的一列。 该函数返回一个索引数组，使用它可以获得排序数据。 注意，最后一个键恰好是 sort 的主键
# print(np.char.center('lexsort() 函数', 15, '*'))
# # 录入了四位同学的成绩
# math = (10, 20, 50, 10)
# chinese = (30, 50, 40, 60)
# total = (40, 70, 90, 70)
# # 将优先级高的项放在后面
# ind = np.lexsort((math, chinese, total))
#
# for i in ind:
#     print(total[i], chinese[i], math[i])

# numpy.msort() 数组按第一个轴排序，返回排序后的数组副本。  从小到大
# print(np.char.center('msort() 函数', 20, '*'))
# msa = np.array([[3, 7, 12, 45], [9, 1, 0, 34]])
# print(np.msort(msa))

# numpy.partition() 指定一个数，对数组进行分区。 就是指定一个数，以这个数为中心，将其他数分别放在这个数的两边。
'''
在第一次排序时，我们选中了索引为2的数字7作为中心，将小于7的数放在左边，大于7的数放在右边。在第二次排序时，
我们选择了索引为2的数字7和索引为4的数字45，将小于7的数放在左边，大于7小于45的数放在中间，大于45的数放在右边。
'''
# print(np.char.center('partition() 函数', 20, '*'))
# pta = np.array([3, 7, 12, 45, 15, 0])
# print(np.partition(pta, 2))
# print('\n')
# print(np.partition(pta, (2, 4)))
# print('\n')

# todo 筛选函数
# numpy.argmax() 返回沿给定轴的最大值索引。 索引的值是从0开始计算的。
# a = np.array([[30, 40, 70], [80, 20, 10], [50, 90, 60]])
# print(np.char.center('初始数组', 20, '*'))
# print(a)
# print('\n')
#
# print(np.char.center('调用 argmax() 函数', 20, '*'))
# print(np.argmax(a))
# print('\n')
#
# print(np.char.center('展开数组', 20, '*'))
# print(a.flatten())
# print('\n')
#
# print(np.char.center('沿0轴的最大索引', 20, '*')) # 竖列
# print(np.argmax(a, 0))
# print('\n')
#
# print(np.char.center('沿1轴的最大索引', 20, '*')) # 横列
# print(np.argmax(a, 1))
# print('\n')

# numpy.argmin() 返回沿给定轴的最小值索引。 索引的值是从0开始计算的。
# a = np.array([[30, 40, 70], [80, 20, 10], [50, 90, 60]])
# print(np.char.center('初始数组', 20, '*'))
# print(a)
# print('\n')
#
# print(np.char.center('调用 argmin() 函数', 20, '*'))
# print(np.argmin(a))
# print('\n')
#
# print(np.char.center('沿0轴的最小索引', 20, '*'))
# print(np.argmin(a, 0))
# print('\n')
#
# print(np.char.center('沿1轴的最小索引', 20, '*'))
# print(np.argmin(a, 1))
# print('\n')

# numpy.nonzero() 返回输入数组中非零元素的索引。
'''
只有a中非零元素才会有索引值，那些零值元素没有索引值；
返回的索引值数组是一个2维tuple数组，该tuple数组中包含一维的array数组。其中，一维array向量的个数与a的维数是一致的。
索引值数组的每一个array均是从一个维度上来描述其索引值。比如，如果a是一个二维数组，则索引值数组有两个array，第一个array从行维度来描述索引值；第二个array从列维度来描述索引值。
该np.transpose(np.nonzero(x)) 函数能够描述出每一个非零元素在不同维度的索引值。
'''
# b = np.array([[30, 40, 0], [0, 20, 10], [50, 0, 60]])
# print(np.char.center('我们的数组是', 20, '*'))
# print(b)
# print(np.char.center('调用 nonzero() 函数', 20, '*'))
# c = np.nonzero(b)
# print(c)
# print(np.transpose(np.nonzero(b)))

# numpy.where() 返回输入数组中满足给定条件的元素的索引。 这里面我们输入的条件是大于20，数组中大于20的数的索引都被查找出来了。
# b = np.array([[30, 40, 0], [0, 20, 10], [50, 0, 60]])
# print(np.char.center('调用 where() 函数', 20, '*'))
# print(np.where(b > 20))
# print(np.transpose(np.where(b > 20)))

# numpy.extract() 根据某个条件从数组中抽取元素，返回满足条件的元素。
# x = np.arange(9.).reshape(3,  3)
# print(np.char.center('我们的数组是', 20, '*'))
# print(x)
# # 定义条件, 选择偶数元素
# condition = np.mod(x, 2) == 0
# print(np.char.center('按元素的条件值', 20, '*'))
# print(condition)
# print(np.char.center('使用条件提取元素', 20, '*'))
# print(np.extract(condition, x))
# todo 我们先定义了一个条件，就是选择偶数。然后我们可以打印这个数组每个元素是否满足条件。最后我们调用 extract() 方法返回满足条件的元素。注意这里返回的是元素，而不是元素的索引。
